package org.fisco.bcos.asset.contract;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.fisco.bcos.sdk.abi.FunctionReturnDecoder;
import org.fisco.bcos.sdk.abi.TypeReference;
import org.fisco.bcos.sdk.abi.datatypes.Address;
import org.fisco.bcos.sdk.abi.datatypes.Bool;
import org.fisco.bcos.sdk.abi.datatypes.DynamicArray;
import org.fisco.bcos.sdk.abi.datatypes.Event;
import org.fisco.bcos.sdk.abi.datatypes.Function;
import org.fisco.bcos.sdk.abi.datatypes.Type;
import org.fisco.bcos.sdk.abi.datatypes.Utf8String;
import org.fisco.bcos.sdk.abi.datatypes.generated.Int256;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple1;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple2;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple3;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple4;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple6;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple7;
import org.fisco.bcos.sdk.client.Client;
import org.fisco.bcos.sdk.contract.Contract;
import org.fisco.bcos.sdk.crypto.CryptoSuite;
import org.fisco.bcos.sdk.crypto.keypair.CryptoKeyPair;
import org.fisco.bcos.sdk.eventsub.EventCallback;
import org.fisco.bcos.sdk.model.CryptoType;
import org.fisco.bcos.sdk.model.TransactionReceipt;
import org.fisco.bcos.sdk.model.callback.TransactionCallback;
import org.fisco.bcos.sdk.transaction.model.exception.ContractException;

@SuppressWarnings("unchecked")
public class SupplierFinancin extends Contract {
    public static final String[] BINARY_ARRAY = {"60806040523480156200001157600080fd5b506000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061100190508073ffffffffffffffffffffffffffffffffffffffff166356004b6a6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401620000ae9062001478565b602060405180830381600087803b158015620000c957600080fd5b505af1158015620000de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000104919081019062000f0a565b508073ffffffffffffffffffffffffffffffffffffffff166356004b6a6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016200015a9062001311565b602060405180830381600087803b1580156200017557600080fd5b505af11580156200018a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620001b0919081019062000f0a565b508073ffffffffffffffffffffffffffffffffffffffff166356004b6a6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016200020690620013fa565b602060405180830381600087803b1580156200022157600080fd5b505af115801562000236573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200025c919081019062000f0a565b50620002db6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040805190810160405280600681526020017f30303030303100000000000000000000000000000000000000000000000000008152506001678ac7230489e800006000620002e4640100000000026401000000009004565b505050620015c2565b6000606060008060006200033c6040805190810160405280600981526020017f745f636f6d70616e79000000000000000000000000000000000000000000000081525062000974640100000000026401000000009004565b92508273ffffffffffffffffffffffffffffffffffffffff1663e8434e39620003748c62000a31640100000000026401000000009004565b8573ffffffffffffffffffffffffffffffffffffffff16637857d7c96040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015620003d957600080fd5b505af1158015620003ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000414919081019062000e5a565b6040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016200044f929190620012a9565b602060405180830381600087803b1580156200046a57600080fd5b505af11580156200047f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620004a5919081019062000e86565b915060008273ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156200050e57600080fd5b505af115801562000523573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000549919081019062000f0a565b141515620005935760006040805190810160405280601881526020017f636f6d70616e792073686f756c64206e6f7420657869737400000000000000008152509450945062000967565b8273ffffffffffffffffffffffffffffffffffffffff166313db93466040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015620005f857600080fd5b505af11580156200060d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000633919081019062000eb2565b90508073ffffffffffffffffffffffffffffffffffffffff1663e942b5168a6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016200068c91906200135d565b600060405180830381600087803b158015620006a757600080fd5b505af1158015620006bc573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16632ef8ba74896040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040162000717919062001396565b600060405180830381600087803b1580156200073257600080fd5b505af115801562000747573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16632ef8ba74886040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401620007a29190620013c8565b600060405180830381600087803b158015620007bd57600080fd5b505af1158015620007d2573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16632ef8ba74876040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016200082d919062001446565b600060405180830381600087803b1580156200084857600080fd5b505af11580156200085d573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff166331afac36620008978c62000a31640100000000026401000000009004565b836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401620008d3929190620012dd565b602060405180830381600087803b158015620008ee57600080fd5b505af115801562000903573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000929919081019062000f0a565b5060016040805190810160405280600781526020017f7375636365656400000000000000000000000000000000000000000000000000815250945094505b5050509550959350505050565b60008061100190508073ffffffffffffffffffffffffffffffffffffffff1663f23f63c9846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401620009d3919062001285565b602060405180830381600087803b158015620009ee57600080fd5b505af115801562000a03573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000a29919081019062000ede565b915050919050565b6060600060608060008573ffffffffffffffffffffffffffffffffffffffff1660010293506040805190810160405280601081526020017f30313233343536373839616263646566000000000000000000000000000000008152509250602a6040519080825280601f01601f19166020018201604052801562000ac35781602001602082028038833980820191505090505b5091507f300000000000000000000000000000000000000000000000000000000000000082600081518110151562000af757fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000082600181518110151562000b5857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600090505b601481101562000de05782600485600c840160208110151562000bac57fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060020a90047f0100000000000000000000000000000000000000000000000000000000000000900481518110151562000c2757fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002826002830260020181518110151562000c8757fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535082600f7f01000000000000000000000000000000000000000000000000000000000000000285600c840160208110151562000cee57fe5b1a7f010000000000000000000000000000000000000000000000000000000000000002167f0100000000000000000000000000000000000000000000000000000000000000900481518110151562000d4257fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002826002830260030181518110151562000da257fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808060010191505062000b8d565b81945050505050919050565b600062000dfa8251620014f9565b905092915050565b600062000e1082516200150d565b905092915050565b600062000e26825162001521565b905092915050565b600062000e3c825162001535565b905092915050565b600062000e52825162001549565b905092915050565b60006020828403121562000e6d57600080fd5b600062000e7d8482850162000dec565b91505092915050565b60006020828403121562000e9957600080fd5b600062000ea98482850162000e02565b91505092915050565b60006020828403121562000ec557600080fd5b600062000ed58482850162000e18565b91505092915050565b60006020828403121562000ef157600080fd5b600062000f018482850162000e2e565b91505092915050565b60006020828403121562000f1d57600080fd5b600062000f2d8482850162000e44565b91505092915050565b62000f418162001553565b82525050565b62000f528162001567565b82525050565b62000f6381620014ef565b82525050565b600062000f7682620014c4565b80845262000f8c8160208601602086016200157b565b62000f9781620015b1565b602085010191505092915050565b6000600c82527f745f696e5f7265636569707400000000000000000000000000000000000000006020830152604082019050919050565b6000600482527f75736363000000000000000000000000000000000000000000000000","000000006020830152604082019050919050565b6000600282527f696e0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000602782527f646562746f722c6465627465652c7265636569707449642c616d6f756e742c6460208301527f6561646c696e65000000000000000000000000000000000000000000000000006040830152606082019050919050565b6000600482527f74797065000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600b82527f696e5f72656365697074730000000000000000000000000000000000000000006020830152604082019050919050565b6000600d82527f745f6f75745f72656365697074000000000000000000000000000000000000006020830152604082019050919050565b6000600c82527f6f75745f726563656970747300000000000000000000000000000000000000006020830152604082019050919050565b6000600982527f745f636f6d70616e7900000000000000000000000000000000000000000000006020830152604082019050919050565b6000600482527f61646472000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000602282527f757363632c747970652c696e5f72656365697074732c6f75745f72656365697060208301527f74730000000000000000000000000000000000000000000000000000000000006040830152606082019050919050565b6000600382527f6f757400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006020820190508181036000830152620012a1818462000f69565b905092915050565b60006040820190508181036000830152620012c5818562000f69565b9050620012d6602083018462000f36565b9392505050565b60006040820190508181036000830152620012f9818562000f69565b90506200130a602083018462000f47565b9392505050565b600060608201905081810360008301526200132c8162000fa5565b90508181036020830152620013418162001013565b9050818103604083015262001356816200104a565b9050919050565b60006040820190508181036000830152620013788162000fdc565b905081810360208301526200138e818462000f69565b905092915050565b60006040820190508181036000830152620013b181620010a7565b9050620013c2602083018462000f58565b92915050565b60006040820190508181036000830152620013e381620010de565b9050620013f4602083018462000f58565b92915050565b60006060820190508181036000830152620014158162001115565b905081810360208301526200142a816200124e565b905081810360408301526200143f816200104a565b9050919050565b6000604082019050818103600083015262001461816200114c565b905062001472602083018462000f58565b92915050565b60006060820190508181036000830152620014938162001183565b90508181036020830152620014a881620011ba565b90508181036040830152620014bd81620011f1565b9050919050565b600081519050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006200150682620014cf565b9050919050565b60006200151a82620014cf565b9050919050565b60006200152e82620014cf565b9050919050565b60006200154282620014cf565b9050919050565b6000819050919050565b60006200156082620014cf565b9050919050565b60006200157482620014cf565b9050919050565b60005b838110156200159b5780820151818401526020810190506200157e565b83811115620015ab576000848401525b50505050565b6000601f19601f8301169050919050565b61493480620015d26000396000f300608060405260043610610099576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631cbf89001461009e5780634cd995da146100e15780636cb52b731461011f5780636e9960c31461015d57806373582dfb146101885780638255a2a5146101c65780638423d01014610206578063c71ba4ec14610244578063c8f2526114610286575b600080fd5b3480156100aa57600080fd5b506100c560048036036100c09190810190613da6565b6102c3565b6040516100d897969594939291906141a6565b60405180910390f35b3480156100ed57600080fd5b5061010860048036036101039190810190613b9c565b610acf565b604051610116929190614176565b60405180910390f35b34801561012b57600080fd5b5061014660048036036101419190810190613cbd565b610c1f565b604051610154929190614176565b60405180910390f35b34801561016957600080fd5b50610172611011565b60405161017f9190614389565b60405180910390f35b34801561019457600080fd5b506101af60048036036101aa9190810190613b9c565b611042565b6040516101bd929190614176565b60405180910390f35b3480156101d257600080fd5b506101ed60048036036101e89190810190613afb565b61119b565b6040516101fd949392919061421c565b60405180910390f35b34801561021257600080fd5b5061022d60048036036102289190810190613b4d565b6111e6565b60405161023b929190614176565b60405180910390f35b34801561025057600080fd5b5061026b60048036036102669190810190613afb565b611500565b60405161027d96959493929190614268565b60405180910390f35b34801561029257600080fd5b506102ad60048036036102a89190810190613d3a565b611b37565b6040516102ba9190614154565b60405180910390f35b600060606000806000806000806000806102db613953565b60006102e68f611ef7565b94508473ffffffffffffffffffffffffffffffffffffffff16637857d7c96040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561034c57600080fd5b505af1158015610360573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506103849190810190613bf0565b93508373ffffffffffffffffffffffffffffffffffffffff1663e44594b98e6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016103db9190614469565b600060405180830381600087803b1580156103f557600080fd5b505af1158015610409573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff1663e8434e398f866040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016104649291906143ab565b602060405180830381600087803b15801561047e57600080fd5b505af1158015610492573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104b69190810190613c19565b925060018373ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561051e57600080fd5b505af1158015610532573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105569190810190613c94565b1415610a31578273ffffffffffffffffffffffffffffffffffffffff1663846719e060006040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016105b291906142f2565b602060405180830381600087803b1580156105cc57600080fd5b505af11580156105e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106049190810190613c42565b90508073ffffffffffffffffffffffffffffffffffffffff1663bf40fac16040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610659906146c7565b602060405180830381600087803b15801561067357600080fd5b505af1158015610687573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106ab9190810190613b24565b826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663bf40fac16040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161073590614497565b602060405180830381600087803b15801561074f57600080fd5b505af1158015610763573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107879190810190613b24565b826020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663fda69fae6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161081190614449565b602060405180830381600087803b15801561082b57600080fd5b505af115801561083f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108639190810190613c94565b8260400181815250508073ffffffffffffffffffffffffffffffffffffffff1663fda69fae6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016108bf9061458f565b602060405180830381600087803b1580156108d957600080fd5b505af11580156108ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109119190810190613c94565b8260600181815250508073ffffffffffffffffffffffffffffffffffffffff1663fda69fae6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161096d90614541565b602060405180830381600087803b15801561098757600080fd5b505af115801561099b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109bf9190810190613c94565b8260800181815250506001826000015183602001518460400151856060015186608001516040805190810160405280600781526020017f737563636565640000000000000000000000000000000000000000000000000081525094939291909b509b509b509b509b509b509b5061","0abd565b600082600001518360200151846040015185606001518660800151606060405190810160405280602b81526020017f7265636569707420696420646f6573206e6f7420657869737473206f7220697381526020017f206e6f7420756e6971756500000000000000000000000000000000000000000081525094939291909b509b509b509b509b509b509b505b50505050509397509397509397909450565b60006060806000806000806060610ae533611500565b809850819950829a50839b50849650859750505050505050600015158215151415610b165760008197509750610c12565b600285141515610b88576000606060405190810160405280602c81526020017f6f6e6c792062616e6b732061726520616c6c6f77656420746f2072656769737481526020017f657220636f6d70616e696573000000000000000000000000000000000000000081525097509750610c12565b610b978a8a6003600080611fae565b50507f752622816ae8467c141ddc8ddfb71fb1024543cd0f13ea2a76b6c06ac3b6f39f60038b8b604051610bcd9392919061434b565b60405180910390a160016040805190810160405280600781526020017f7375636365656400000000000000000000000000000000000000000000000000815250975097505b5050505050509250929050565b60006060610c2b613953565b60006060600080610c7a6040805190810160405280600c81526020017f745f696e5f726563656970740000000000000000000000000000000000000000815250610c74336125e1565b8b6102c3565b8b6000018c6020018d6040018e6060018f6080018581525085815250858152508573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152508573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250859950869a5050505050505050600015158415151415610d205760008396509650611005565b600088131515610d6b5760006040805190810160405280602081526020017f616d6f756e74206d7573742062652067726561746572207468616e207a65726f81525096509650611005565b8785606001511215610e05576000608060405190810160405280604481526020017f72657475726e696e6720637265646974206d6f7265207468616e20616d6f756e81526020017f74207472616e736665726564206174206669727374206973206e6f7420616c6c81526020017f6f7765640000000000000000000000000000000000000000000000000000000081525096509650611005565b610e586040805190810160405280600c81526020017f745f696e5f726563656970740000000000000000000000000000000000000000815250610e4b87602001516125e1565b8b8b896060015103612991565b8094508195505050600015158415151415610e795760008396509650611005565b610ecc6040805190810160405280600d81526020017f745f6f75745f7265636569707400000000000000000000000000000000000000815250610ebf87600001516125e1565b8b8b896060015103612991565b8094508195505050600015158415151415610eed5760008396509650611005565b610efa856000015161119b565b80945081955082965083975050505050600015158415151415610f235760008396509650611005565b8781039050610f3785600001518383612f3c565b5050610f46856020015161119b565b809450819550829650839750505050508782039150610f6a85602001518383612f3c565b5050600015158415151415610f855760008396509650611005565b7f60a64ccbda514a86bf3494f3ecff474c63df22088d1b87331c254506e7906751856000015186602001518a604051610fc09392919061411d565b60405180910390a160016040805190810160405280600781526020017f7375636365656400000000000000000000000000000000000000000000000000815250965096505b50505050509250929050565b606061103d6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff166125e1565b905090565b600060606000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611104576000606060405190810160405280603081526020017f6f6e6c79207468652041646d696e2042616e6b20697320616c6c6f776564207481526020017f6f2072656769737465722062616e6b730000000000000000000000000000000081525091509150611194565b611119848460026509184e72a0006000611fae565b50507f752622816ae8467c141ddc8ddfb71fb1024543cd0f13ea2a76b6c06ac3b6f39f6002858560405161114f9392919061430d565b60405180910390a160016040805190810160405280600781526020017f7375636365656400000000000000000000000000000000000000000000000000815250915091505b9250929050565b60006060600080606060008060008060606111b58b611500565b809850819950829a50839b508496508597505050505050508181858599509950995099505050505050509193509193565b60006060600080600060606000806111fc613953565b6112053361119b565b809950819a508297508398505050505060001515851515141561122e57600084985098506114f1565b6112378c61119b565b8095508196508297508398505050505060001515851515141561126057600084985098506114f1565b60008b1315156112ab5760006040805190810160405280602081526020017f616d6f756e74206d7573742062652067726561746572207468616e207a65726f815250985098506114f1565b8a868803121561131d576000606060405190810160405280602381526020017f646562746f7220646f6573206e6f74206861766520656e6f7567682062616c6181526020017f6e63650000000000000000000000000000000000000000000000000000000000815250985098506114f1565b8a860195508a83019250611332338888612f3c565b809550819650505060001515851515141561135357600084985098506114f1565b61135e8c8484612f3c565b809550819650505060001515851515141561137f57600084985098506114f1565b60016000815480929190600101919050555060a0604051908101604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815260200160015481526020018c81526020018b81525090506114316040805190810160405280600c81526020017f745f696e5f72656365697074000000000000000000000000000000000000000081525061142b8e6125e1565b8361352f565b6114796040805190810160405280600d81526020017f745f6f75745f7265636569707400000000000000000000000000000000000000815250611473336125e1565b8361352f565b7f5a2dff6dba16894d4aa0d365f37b2a4fd61d74c370a7fe1637f527cb49e8f463338d8d6040516114ac9392919061411d565b60405180910390a160016040805190810160405280600781526020017f7375636365656400000000000000000000000000000000000000000000000000815250985098505b50505050505050935093915050565b600060608060008060008060008061154c6040805190810160405280600981526020017f745f636f6d70616e790000000000000000000000000000000000000000000000815250611ef7565b92508273ffffffffffffffffffffffffffffffffffffffff1663e8434e396115738c6125e1565b8573ffffffffffffffffffffffffffffffffffffffff16637857d7c96040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156115d757600080fd5b505af11580156115eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061160f9190810190613bf0565b6040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016116489291906143ab565b602060405180830381600087803b15801561166257600080fd5b505af1158015611676573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061169a9190810190613c19565b915060009850606060405190810160405280602781526020017f636f6d70616e7920646f6573206e6f74206578697374206f72206973206e6f7481526020017f20756e6971756500000000000000000000000000000000000000000000000000815250975060018273ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561176557600080fd5b505af1158015611779573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061179d9190810190613c94565b1415611b2b57600198506040805190810160405280600781526020017f737563636565640000000000000000000000000000000000000000000000000081525097508173ffffffffffffffffffffffffffffffffffffffff1663846719e060006040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161183591906142f2565b602060405180830381600087803b15801561184f57600080fd5b505af1158015611863573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506118879190810190613c42565b90508073ffffffffffffffffffffffffffffffffffffffff16639c981fcb6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016118dc906144ec565b600060405180830381600087803b1580156118f657600080fd5b505af115801561190a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506119339190810190613cf9565b96508073ffffffffffffffffffffffffffffffffffffffff1663fda69fae6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611988906145dd565b602060405180830381600087803b1580156119a257600080fd5b505af11580156119b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119da9190810190613c94565b95508073ffffffffffffffffffffffffffffffffffffffff1663fda69fae6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611a2f9061462b","565b602060405180830381600087803b158015611a4957600080fd5b505af1158015611a5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a819190810190613c94565b94508073ffffffffffffffffffffffffffffffffffffffff1663fda69fae6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611ad690614679565b602060405180830381600087803b158015611af057600080fd5b505af1158015611b04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611b289190810190613c94565b93505b50505091939550919395565b606060008060008060606000611b4c89611ef7565b95508573ffffffffffffffffffffffffffffffffffffffff1663e8434e39898873ffffffffffffffffffffffffffffffffffffffff16637857d7c96040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611bcf57600080fd5b505af1158015611be3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c079190810190613bf0565b6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611c409291906143ab565b602060405180830381600087803b158015611c5a57600080fd5b505af1158015611c6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c929190810190613c19565b94508473ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611cf857600080fd5b505af1158015611d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d309190810190613c94565b925082604051908082528060200260200182016040528015611d615781602001602082028038833980820191505090505b509150600090505b82811015611ee8578473ffffffffffffffffffffffffffffffffffffffff1663846719e0826040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611dc691906142d7565b602060405180830381600087803b158015611de057600080fd5b505af1158015611df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611e189190810190613c42565b93508373ffffffffffffffffffffffffffffffffffffffff1663fda69fae6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611e6d90614449565b602060405180830381600087803b158015611e8757600080fd5b505af1158015611e9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ebf9190810190613c94565b8282815181101515611ecd57fe5b90602001906020020181815250508080600101915050611d69565b81965050505050505092915050565b60008061100190508073ffffffffffffffffffffffffffffffffffffffff1663f23f63c9846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611f549190614389565b602060405180830381600087803b158015611f6e57600080fd5b505af1158015611f82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611fa69190810190613c6b565b915050919050565b600060606000806000611ff56040805190810160405280600981526020017f745f636f6d70616e790000000000000000000000000000000000000000000000815250611ef7565b92508273ffffffffffffffffffffffffffffffffffffffff1663e8434e3961201c8c6125e1565b8573ffffffffffffffffffffffffffffffffffffffff16637857d7c96040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561208057600080fd5b505af1158015612094573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506120b89190810190613bf0565b6040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016120f19291906143ab565b602060405180830381600087803b15801561210b57600080fd5b505af115801561211f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121439190810190613c19565b915060008273ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156121ab57600080fd5b505af11580156121bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121e39190810190613c94565b14151561222b5760006040805190810160405280601881526020017f636f6d70616e792073686f756c64206e6f742065786973740000000000000000815250945094506125d4565b8273ffffffffffffffffffffffffffffffffffffffff166313db93466040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561228f57600080fd5b505af11580156122a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122c79190810190613c42565b90508073ffffffffffffffffffffffffffffffffffffffff1663e942b5168a6040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161231e919061450c565b600060405180830381600087803b15801561233857600080fd5b505af115801561234c573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16632ef8ba74896040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016123a591906145fd565b600060405180830381600087803b1580156123bf57600080fd5b505af11580156123d3573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16632ef8ba74886040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161242c919061464b565b600060405180830381600087803b15801561244657600080fd5b505af115801561245a573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16632ef8ba74876040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016124b39190614699565b600060405180830381600087803b1580156124cd57600080fd5b505af11580156124e1573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff166331afac3661250a8c6125e1565b836040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016125449291906143db565b602060405180830381600087803b15801561255e57600080fd5b505af1158015612572573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125969190810190613c94565b5060016040805190810160405280600781526020017f7375636365656400000000000000000000000000000000000000000000000000815250945094505b5050509550959350505050565b6060600060608060008573ffffffffffffffffffffffffffffffffffffffff1660010293506040805190810160405280601081526020017f30313233343536373839616263646566000000000000000000000000000000008152509250602a6040519080825280601f01601f1916602001820160405280156126725781602001602082028038833980820191505090505b5091507f30000000000000000000000000000000000000000000000000000000000000008260008151811015156126a557fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000082600181518110151561270557fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600090505b60148110156129855782600485600c840160208110151561275757fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060020a90047f010000000000000000000000000000000000000000000000000000000000000090048151811015156127d157fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002826002830260020181518110151561283057fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535082600f7f01000000000000000000000000000000000000000000000000000000000000000285600c840160208110151561289657fe5b1a7f010000000000000000000000000000000000000000000000000000000000000002167f010000000000000000000000000000000000000000000000000000000000000090048151811015156128e957fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002826002830260030181518110151561294857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808060010191505061273a565b81945050505050919050565b600060606000806000806129a48a611ef7565b93508373ffffffffffffffffffffffffffffffffffffffff16637857d7c96040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015612a0a57600080fd5b505af1158015612a1e573d6000803e3d6000fd5b505050506040513d601f19601f8201","1682018060405250612a429190810190613bf0565b92508273ffffffffffffffffffffffffffffffffffffffff1663e44594b9896040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612a999190614469565b600060405180830381600087803b158015612ab357600080fd5b505af1158015612ac7573d6000803e3d6000fd5b50505050600087131515612b84578373ffffffffffffffffffffffffffffffffffffffff166328bb21178a856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612b2c9291906143ab565b602060405180830381600087803b158015612b4657600080fd5b505af1158015612b5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612b7e9190810190613c94565b50612f2f565b8373ffffffffffffffffffffffffffffffffffffffff1663e8434e398a856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612bdb9291906143ab565b602060405180830381600087803b158015612bf557600080fd5b505af1158015612c09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c2d9190810190613c19565b915060018273ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015612c9557600080fd5b505af1158015612ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612ccd9190810190613c94565b141515612d155760006040805190810160405280601f81526020017f72656365697074206964206e6f7420657869737473206f7220756e697175650081525095509550612f2f565b8173ffffffffffffffffffffffffffffffffffffffff1663846719e060006040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612d6b91906142f2565b602060405180830381600087803b158015612d8557600080fd5b505af1158015612d99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612dbd9190810190613c42565b90508073ffffffffffffffffffffffffffffffffffffffff16632ef8ba74886040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612e1491906145af565b600060405180830381600087803b158015612e2e57600080fd5b505af1158015612e42573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff1663bf2b70a18a83866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612e9f9392919061440b565b602060405180830381600087803b158015612eb957600080fd5b505af1158015612ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612ef19190810190613c94565b5060016040805190810160405280600781526020017f7375636365656400000000000000000000000000000000000000000000000000815250955095505b5050505094509492505050565b600060606000806000612f836040805190810160405280600981526020017f745f636f6d70616e790000000000000000000000000000000000000000000000815250611ef7565b92508273ffffffffffffffffffffffffffffffffffffffff1663e8434e39612faa8a6125e1565b8573ffffffffffffffffffffffffffffffffffffffff16637857d7c96040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561300e57600080fd5b505af1158015613022573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130469190810190613bf0565b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161307f9291906143ab565b602060405180830381600087803b15801561309957600080fd5b505af11580156130ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130d19190810190613c19565b915060018273ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561313957600080fd5b505af115801561314d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131719190810190613c94565b1415156131e0576000606060405190810160405280602781526020017f636f6d70616e7920646f6573206e6f74206578697374206f72206973206e6f7481526020017f20756e697175650000000000000000000000000000000000000000000000000081525094509450613524565b8173ffffffffffffffffffffffffffffffffffffffff1663846719e060006040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161323691906142f2565b602060405180830381600087803b15801561325057600080fd5b505af1158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613c42565b90508073ffffffffffffffffffffffffffffffffffffffff16632ef8ba74886040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016132df919061464b565b600060405180830381600087803b1580156132f957600080fd5b505af115801561330d573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16632ef8ba74876040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016133669190614699565b600060405180830381600087803b15801561338057600080fd5b505af1158015613394573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663bf2b70a16133bd8a6125e1565b838673ffffffffffffffffffffffffffffffffffffffff16637857d7c96040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561342257600080fd5b505af1158015613436573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061345a9190810190613bf0565b6040518463ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016134949392919061440b565b602060405180830381600087803b1580156134ae57600080fd5b505af11580156134c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506134e69190810190613c94565b5060016040805190810160405280600781526020017f7375636365656400000000000000000000000000000000000000000000000000815250945094505b505050935093915050565b60008061353b85611ef7565b91508173ffffffffffffffffffffffffffffffffffffffff166313db93466040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156135a157600080fd5b505af11580156135b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506135d99190810190613c42565b90508073ffffffffffffffffffffffffffffffffffffffff1663e942b51661360485600001516125e1565b6040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161363c91906146e7565b600060405180830381600087803b15801561365657600080fd5b505af115801561366a573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663e942b51661369785602001516125e1565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016136cf91906144b7565b600060405180830381600087803b1580156136e957600080fd5b505af11580156136fd573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16632ef8ba7484604001516040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161375a9190614469565b600060405180830381600087803b15801561377457600080fd5b505af1158015613788573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16632ef8ba7484606001516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016137e591906145af565b600060405180830381600087803b1580156137ff57600080fd5b505af1158015613813573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16632ef8ba7484608001516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016138709190614561565b600060405180830381600087803b15801561388a57600080fd5b505af115801561389e573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff166331afac3685836040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016138f99291906143db565b602060405180830381600087803b15801561391357600080fd5b505af1158015613927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061394b9190810190613c94565b505050505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081525090565b60006139bb82356147db565b905092915050565b60006139cf82516147db565b905092915050565b60006139e382516147fb565b905092915050565b60006139f7825161480d565b905092915050565b6000613a0b825161481f565b905092915050565b6000613a1f8251614831565b905092915050565b6000613a3382","35614843565b905092915050565b6000613a478251614843565b905092915050565b600082601f8301121515613a6257600080fd5b8135613a75613a7082614749565b61471c565b91508082526020830160208301858383011115613a9157600080fd5b613a9c8382846148a7565b50505092915050565b600082601f8301121515613ab857600080fd5b8151613acb613ac682614749565b61471c565b91508082526020830160208301858383011115613ae757600080fd5b613af28382846148b6565b50505092915050565b600060208284031215613b0d57600080fd5b6000613b1b848285016139af565b91505092915050565b600060208284031215613b3657600080fd5b6000613b44848285016139c3565b91505092915050565b600080600060608486031215613b6257600080fd5b6000613b70868287016139af565b9350506020613b8186828701613a27565b9250506040613b9286828701613a27565b9150509250925092565b60008060408385031215613baf57600080fd5b6000613bbd858286016139af565b925050602083013567ffffffffffffffff811115613bda57600080fd5b613be685828601613a4f565b9150509250929050565b600060208284031215613c0257600080fd5b6000613c10848285016139d7565b91505092915050565b600060208284031215613c2b57600080fd5b6000613c39848285016139eb565b91505092915050565b600060208284031215613c5457600080fd5b6000613c62848285016139ff565b91505092915050565b600060208284031215613c7d57600080fd5b6000613c8b84828501613a13565b91505092915050565b600060208284031215613ca657600080fd5b6000613cb484828501613a3b565b91505092915050565b60008060408385031215613cd057600080fd5b6000613cde85828601613a27565b9250506020613cef85828601613a27565b9150509250929050565b600060208284031215613d0b57600080fd5b600082015167ffffffffffffffff811115613d2557600080fd5b613d3184828501613aa5565b91505092915050565b60008060408385031215613d4d57600080fd5b600083013567ffffffffffffffff811115613d6757600080fd5b613d7385828601613a4f565b925050602083013567ffffffffffffffff811115613d9057600080fd5b613d9c85828601613a4f565b9150509250929050565b600080600060608486031215613dbb57600080fd5b600084013567ffffffffffffffff811115613dd557600080fd5b613de186828701613a4f565b935050602084013567ffffffffffffffff811115613dfe57600080fd5b613e0a86828701613a4f565b9250506040613e1b86828701613a27565b9150509250925092565b613e2e816147a5565b82525050565b6000613e3f82614782565b808452602084019350613e5183614775565b60005b82811015613e8357613e67868351613ebc565b613e7082614798565b9150602086019550600181019050613e54565b50849250505092915050565b613e98816147c5565b82525050565b613ea78161484d565b82525050565b613eb68161485f565b82525050565b613ec5816147d1565b82525050565b613ed481614871565b82525050565b613ee381614883565b82525050565b613ef281614895565b82525050565b6000613f038261478d565b808452613f178160208601602086016148b6565b613f20816148e9565b602085010191505092915050565b6000600982527f72656365697074496400000000000000000000000000000000000000000000006020830152604082019050919050565b6000600682527f64656274656500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600482527f75736363000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600882527f646561646c696e650000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600682527f616d6f756e7400000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600482527f74797065000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600b82527f696e5f72656365697074730000000000000000000000000000000000000000006020830152604082019050919050565b6000600c82527f6f75745f726563656970747300000000000000000000000000000000000000006020830152604082019050919050565b6000600682527f646562746f7200000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006060820190506141326000830186613e25565b61413f6020830185613e25565b61414c6040830184613ebc565b949350505050565b6000602082019050818103600083015261416e8184613e34565b905092915050565b600060408201905061418b6000830185613e8f565b818103602083015261419d8184613ef8565b90509392505050565b600060e0820190506141bb600083018a613e8f565b81810360208301526141cd8189613ef8565b90506141dc6040830188613e25565b6141e96060830187613e25565b6141f66080830186613ebc565b61420360a0830185613ebc565b61421060c0830184613ebc565b98975050505050505050565b60006080820190506142316000830187613e8f565b81810360208301526142438186613ef8565b90506142526040830185613ebc565b61425f6060830184613ebc565b95945050505050565b600060c08201905061427d6000830189613e8f565b818103602083015261428f8188613ef8565b905081810360408301526142a38187613ef8565b90506142b26060830186613ebc565b6142bf6080830185613ebc565b6142cc60a0830184613ebc565b979650505050505050565b60006020820190506142ec6000830184613ebc565b92915050565b60006020820190506143076000830184613ecb565b92915050565b60006060820190506143226000830186613eda565b61432f6020830185613e25565b81810360408301526143418184613ef8565b9050949350505050565b60006060820190506143606000830186613ee9565b61436d6020830185613e25565b818103604083015261437f8184613ef8565b9050949350505050565b600060208201905081810360008301526143a38184613ef8565b905092915050565b600060408201905081810360008301526143c58185613ef8565b90506143d46020830184613e9e565b9392505050565b600060408201905081810360008301526143f58185613ef8565b90506144046020830184613ead565b9392505050565b600060608201905081810360008301526144258186613ef8565b90506144346020830185613ead565b6144416040830184613e9e565b949350505050565b6000602082019050818103600083015261446281613f2e565b9050919050565b6000604082019050818103600083015261448281613f2e565b90506144916020830184613ebc565b92915050565b600060208201905081810360008301526144b081613f65565b9050919050565b600060408201905081810360008301526144d081613f65565b905081810360208301526144e48184613ef8565b905092915050565b6000602082019050818103600083015261450581613f9c565b9050919050565b6000604082019050818103600083015261452581613f9c565b905081810360208301526145398184613ef8565b905092915050565b6000602082019050818103600083015261455a81613fd3565b9050919050565b6000604082019050818103600083015261457a81613fd3565b90506145896020830184613ebc565b92915050565b600060208201905081810360008301526145a88161400a565b9050919050565b600060408201905081810360008301526145c88161400a565b90506145d76020830184613ebc565b92915050565b600060208201905081810360008301526145f681614041565b9050919050565b6000604082019050818103600083015261461681614041565b90506146256020830184613ebc565b92915050565b6000602082019050818103600083015261464481614078565b9050919050565b6000604082019050818103600083015261466481614078565b90506146736020830184613ebc565b92915050565b60006020820190508181036000830152614692816140af565b9050919050565b600060408201905081810360008301526146b2816140af565b90506146c16020830184613ebc565b92915050565b600060208201905081810360008301526146e0816140e6565b9050919050565b60006040820190508181036000830152614700816140e6565b905081810360208301526147148184613ef8565b905092915050565b6000604051905081810181811067ffffffffffffffff8211171561473f57600080fd5b8060405250919050565b600067ffffffffffffffff82111561476057600080fd5b601f19601f8301169050602081019050919050565b6000602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614806826147a5565b9050919050565b6000614818826147a5565b9050919050565b600061482a826147a5565b9050919050565b600061483c826147a5565b9050919050565b6000819050919050565b6000614858826147a5565b9050919050565b600061486a826147a5565b9050919050565b600061487c826147d1565b9050919050565b600061488e826147d1565b9050919050565b60006148a0826147d1565b9050919050565b82818337600083830152505050565b60005b838110156148d45780820151818401526020810190506148b9565b838111156148e3576000848401525b50505050565b6000601f19601f83011690509190505600a265627a7a72305820e8abd5c94ba4da6662cdd1da68b713228485a773e45af0629ed7c2ccd03bc9d86c6578706572696d656e74616cf50037"};

    public static final String BINARY = String.join("", BINARY_ARRAY);

    public static final String[] SM_BINARY_ARRAY = {"60806040523480156200001157600080fd5b506000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061100190508073ffffffffffffffffffffffffffffffffffffffff1663c92a78016040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401620000ae906200135d565b602060405180830381600087803b158015620000c957600080fd5b505af1158015620000de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000104919081019062000f0a565b508073ffffffffffffffffffffffffffffffffffffffff1663c92a78016040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016200015a9062001311565b602060405180830381600087803b1580156200017557600080fd5b505af11580156200018a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620001b0919081019062000f0a565b508073ffffffffffffffffffffffffffffffffffffffff1663c92a78016040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040162000206906200140d565b602060405180830381600087803b1580156200022157600080fd5b505af115801562000236573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200025c919081019062000f0a565b50620002db6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040805190810160405280600681526020017f30303030303100000000000000000000000000000000000000000000000000008152506001678ac7230489e800006000620002e4640100000000026401000000009004565b505050620015c2565b6000606060008060006200033c6040805190810160405280600981526020017f745f636f6d70616e79000000000000000000000000000000000000000000000081525062000974640100000000026401000000009004565b92508273ffffffffffffffffffffffffffffffffffffffff1663d8ac5957620003748c62000a31640100000000026401000000009004565b8573ffffffffffffffffffffffffffffffffffffffff1663c74f8caf6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015620003d957600080fd5b505af1158015620003ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000414919081019062000e5a565b6040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016200044f929190620012a9565b602060405180830381600087803b1580156200046a57600080fd5b505af11580156200047f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620004a5919081019062000e86565b915060008273ffffffffffffffffffffffffffffffffffffffff1663d3e9af5a6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156200050e57600080fd5b505af115801562000523573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000549919081019062000f0a565b141515620005935760006040805190810160405280601881526020017f636f6d70616e792073686f756c64206e6f7420657869737400000000000000008152509450945062000967565b8273ffffffffffffffffffffffffffffffffffffffff16635887ab246040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015620005f857600080fd5b505af11580156200060d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000633919081019062000eb2565b90508073ffffffffffffffffffffffffffffffffffffffff16631a391cb48a6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016200068c91906200148b565b600060405180830381600087803b158015620006a757600080fd5b505af1158015620006bc573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663def42698896040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040162000717919062001459565b600060405180830381600087803b1580156200073257600080fd5b505af115801562000747573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663def42698886040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401620007a29190620013a9565b600060405180830381600087803b158015620007bd57600080fd5b505af1158015620007d2573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663def42698876040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016200082d9190620013db565b600060405180830381600087803b1580156200084857600080fd5b505af11580156200085d573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff16634c6f30c0620008978c62000a31640100000000026401000000009004565b836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401620008d3929190620012dd565b602060405180830381600087803b158015620008ee57600080fd5b505af115801562000903573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000929919081019062000f0a565b5060016040805190810160405280600781526020017f7375636365656400000000000000000000000000000000000000000000000000815250945094505b5050509550959350505050565b60008061100190508073ffffffffffffffffffffffffffffffffffffffff166359a48b65846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401620009d3919062001285565b602060405180830381600087803b158015620009ee57600080fd5b505af115801562000a03573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000a29919081019062000ede565b915050919050565b6060600060608060008573ffffffffffffffffffffffffffffffffffffffff1660010293506040805190810160405280601081526020017f30313233343536373839616263646566000000000000000000000000000000008152509250602a6040519080825280601f01601f19166020018201604052801562000ac35781602001602082028038833980820191505090505b5091507f300000000000000000000000000000000000000000000000000000000000000082600081518110151562000af757fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000082600181518110151562000b5857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600090505b601481101562000de05782600485600c840160208110151562000bac57fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060020a90047f0100000000000000000000000000000000000000000000000000000000000000900481518110151562000c2757fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002826002830260020181518110151562000c8757fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535082600f7f01000000000000000000000000000000000000000000000000000000000000000285600c840160208110151562000cee57fe5b1a7f010000000000000000000000000000000000000000000000000000000000000002167f0100000000000000000000000000000000000000000000000000000000000000900481518110151562000d4257fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002826002830260030181518110151562000da257fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808060010191505062000b8d565b81945050505050919050565b600062000dfa8251620014f9565b905092915050565b600062000e1082516200150d565b905092915050565b600062000e26825162001521565b905092915050565b600062000e3c825162001535565b905092915050565b600062000e52825162001549565b905092915050565b60006020828403121562000e6d57600080fd5b600062000e7d8482850162000dec565b91505092915050565b60006020828403121562000e9957600080fd5b600062000ea98482850162000e02565b91505092915050565b60006020828403121562000ec557600080fd5b600062000ed58482850162000e18565b91505092915050565b60006020828403121562000ef157600080fd5b600062000f018482850162000e2e565b91505092915050565b60006020828403121562000f1d57600080fd5b600062000f2d8482850162000e44565b91505092915050565b62000f418162001553565b82525050565b62000f528162001567565b82525050565b62000f6381620014ef565b82525050565b600062000f7682620014c4565b80845262000f8c8160208601602086016200157b565b62000f9781620015b1565b602085010191505092915050565b6000602282527f757363632c747970652c696e5f72656365697074732c6f75745f72656365697060208301527f747300000000000000000000000000000000000000000000000000000000000060408301526060820190509190","50565b6000600c82527f745f696e5f7265636569707400000000000000000000000000000000000000006020830152604082019050919050565b6000600482527f61646472000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600282527f696e0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600982527f745f636f6d70616e7900000000000000000000000000000000000000000000006020830152604082019050919050565b6000600b82527f696e5f72656365697074730000000000000000000000000000000000000000006020830152604082019050919050565b6000600c82527f6f75745f726563656970747300000000000000000000000000000000000000006020830152604082019050919050565b6000600d82527f745f6f75745f72656365697074000000000000000000000000000000000000006020830152604082019050919050565b6000600482527f74797065000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600482527f75736363000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600382527f6f757400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000602782527f646562746f722c6465627465652c7265636569707449642c616d6f756e742c6460208301527f6561646c696e65000000000000000000000000000000000000000000000000006040830152606082019050919050565b60006020820190508181036000830152620012a1818462000f69565b905092915050565b60006040820190508181036000830152620012c5818562000f69565b9050620012d6602083018462000f36565b9392505050565b60006040820190508181036000830152620012f9818562000f69565b90506200130a602083018462000f47565b9392505050565b600060608201905081810360008301526200132c8162001002565b90508181036020830152620013418162001070565b90508181036040830152620013568162001228565b9050919050565b600060608201905081810360008301526200137881620010a7565b905081810360208301526200138d8162001039565b90508181036040830152620013a28162000fa5565b9050919050565b60006040820190508181036000830152620013c481620010de565b9050620013d5602083018462000f58565b92915050565b60006040820190508181036000830152620013f68162001115565b905062001407602083018462000f58565b92915050565b6000606082019050818103600083015262001428816200114c565b905081810360208301526200143d81620011f1565b90508181036040830152620014528162001228565b9050919050565b60006040820190508181036000830152620014748162001183565b905062001485602083018462000f58565b92915050565b60006040820190508181036000830152620014a681620011ba565b90508181036020830152620014bc818462000f69565b905092915050565b600081519050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006200150682620014cf565b9050919050565b60006200151a82620014cf565b9050919050565b60006200152e82620014cf565b9050919050565b60006200154282620014cf565b9050919050565b6000819050919050565b60006200156082620014cf565b9050919050565b60006200157482620014cf565b9050919050565b60005b838110156200159b5780820151818401526020810190506200157e565b83811115620015ab576000848401525b50505050565b6000601f19601f8301169050919050565b61493480620015d26000396000f300608060405260043610610099576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806312bc27661461009e5780631465de9d146100e15780633fd57a621461011f578063669c668f1461015d578063688ccaba1461019a578063bbb7694c146101c5578063e727dbb814610203578063f138191e14610243578063fe5e77e714610281575b600080fd5b3480156100aa57600080fd5b506100c560048036036100c09190810190613da6565b6102c3565b6040516100d897969594939291906141a6565b60405180910390f35b3480156100ed57600080fd5b5061010860048036036101039190810190613b4d565b610acf565b604051610116929190614176565b60405180910390f35b34801561012b57600080fd5b5061014660048036036101419190810190613b9c565b610de9565b604051610154929190614176565b60405180910390f35b34801561016957600080fd5b50610184600480360361017f9190810190613d3a565b610f42565b6040516101919190614154565b60405180910390f35b3480156101a657600080fd5b506101af611302565b6040516101bc9190614389565b60405180910390f35b3480156101d157600080fd5b506101ec60048036036101e79190810190613cbd565b611333565b6040516101fa929190614176565b60405180910390f35b34801561020f57600080fd5b5061022a60048036036102259190810190613afb565b611725565b60405161023a949392919061421c565b60405180910390f35b34801561024f57600080fd5b5061026a60048036036102659190810190613b9c565b611770565b604051610278929190614176565b60405180910390f35b34801561028d57600080fd5b506102a860048036036102a39190810190613afb565b6118c0565b6040516102ba96959493929190614268565b60405180910390f35b600060606000806000806000806000806102db613953565b60006102e68f611ef7565b94508473ffffffffffffffffffffffffffffffffffffffff1663c74f8caf6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561034c57600080fd5b505af1158015610360573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506103849190810190613bf0565b93508373ffffffffffffffffffffffffffffffffffffffff1663d62b54b48e6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016103db9190614469565b600060405180830381600087803b1580156103f557600080fd5b505af1158015610409573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff1663d8ac59578f866040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016104649291906143ab565b602060405180830381600087803b15801561047e57600080fd5b505af1158015610492573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104b69190810190613c19565b925060018373ffffffffffffffffffffffffffffffffffffffff1663d3e9af5a6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561051e57600080fd5b505af1158015610532573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105569190810190613c94565b1415610a31578273ffffffffffffffffffffffffffffffffffffffff16633dd2b61460006040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016105b291906142f2565b602060405180830381600087803b1580156105cc57600080fd5b505af11580156105e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106049190810190613c42565b90508073ffffffffffffffffffffffffffffffffffffffff166307afbf3a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161065990614672565b602060405180830381600087803b15801561067357600080fd5b505af1158015610687573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106ab9190810190613b24565b826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff166307afbf3a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161073590614581565b602060405180830381600087803b15801561074f57600080fd5b505af1158015610763573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107879190810190613b24565b826020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff16634900862e6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161081190614449565b602060405180830381600087803b15801561082b57600080fd5b505af115801561083f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108639190810190613c94565b8260400181815250508073ffffffffffffffffffffffffffffffffffffffff16634900862e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016108bf90614533565b602060405180830381600087803b1580156108d957600080fd5b505af11580156108ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109119190810190613c94565b8260600181815250508073ffffffffffffffffffffffffffffffffffffffff16634900862e6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161096d90614624565b602060405180830381600087803b15801561098757600080fd5b505af115801561099b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109bf9190810190613c94565b8260800181815250506001826000015183602001518460400151856060015186608001516040805190810160405280600781526020017f737563636565640000000000000000000000000000000000000000000000000081525094939291909b509b509b509b509b509b509b5061","0abd565b600082600001518360200151846040015185606001518660800151606060405190810160405280602b81526020017f7265636569707420696420646f6573206e6f7420657869737473206f7220697381526020017f206e6f7420756e6971756500000000000000000000000000000000000000000081525094939291909b509b509b509b509b509b509b505b50505050509397509397509397909450565b6000606060008060006060600080610ae5613953565b610aee33611725565b809950819a5082975083985050505050600015158515151415610b175760008498509850610dda565b610b208c611725565b80955081965082975083985050505050600015158515151415610b495760008498509850610dda565b60008b131515610b945760006040805190810160405280602081526020017f616d6f756e74206d7573742062652067726561746572207468616e207a65726f81525098509850610dda565b8a8688031215610c06576000606060405190810160405280602381526020017f646562746f7220646f6573206e6f74206861766520656e6f7567682062616c6181526020017f6e6365000000000000000000000000000000000000000000000000000000000081525098509850610dda565b8a860195508a83019250610c1b338888611fae565b8095508196505050600015158515151415610c3c5760008498509850610dda565b610c478c8484611fae565b8095508196505050600015158515151415610c685760008498509850610dda565b60016000815480929190600101919050555060a0604051908101604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815260200160015481526020018c81526020018b8152509050610d1a6040805190810160405280600c81526020017f745f696e5f726563656970740000000000000000000000000000000000000000815250610d148e6125a1565b83612951565b610d626040805190810160405280600d81526020017f745f6f75745f7265636569707400000000000000000000000000000000000000815250610d5c336125a1565b83612951565b7f324e68bb8c9f66659bfab5b1d4214c19aac6d58c4711a93021d20015754ee6f4338d8d604051610d959392919061411d565b60405180910390a160016040805190810160405280600781526020017f7375636365656400000000000000000000000000000000000000000000000000815250985098505b50505050505050935093915050565b600060606000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610eab576000606060405190810160405280603081526020017f6f6e6c79207468652041646d696e2042616e6b20697320616c6c6f776564207481526020017f6f2072656769737465722062616e6b730000000000000000000000000000000081525091509150610f3b565b610ec0848460026509184e72a0006000612d75565b50507f526aa5c4a7b2027c55b69064b0a1fd286088158b686f08699d4497a93b5b2e6660028585604051610ef69392919061430d565b60405180910390a160016040805190810160405280600781526020017f7375636365656400000000000000000000000000000000000000000000000000815250915091505b9250929050565b606060008060008060606000610f5789611ef7565b95508573ffffffffffffffffffffffffffffffffffffffff1663d8ac5957898873ffffffffffffffffffffffffffffffffffffffff1663c74f8caf6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015610fda57600080fd5b505af1158015610fee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110129190810190613bf0565b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161104b9291906143ab565b602060405180830381600087803b15801561106557600080fd5b505af1158015611079573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061109d9190810190613c19565b94508473ffffffffffffffffffffffffffffffffffffffff1663d3e9af5a6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561110357600080fd5b505af1158015611117573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061113b9190810190613c94565b92508260405190808252806020026020018201604052801561116c5781602001602082028038833980820191505090505b509150600090505b828110156112f3578473ffffffffffffffffffffffffffffffffffffffff16633dd2b614826040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016111d191906142d7565b602060405180830381600087803b1580156111eb57600080fd5b505af11580156111ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112239190810190613c42565b93508373ffffffffffffffffffffffffffffffffffffffff16634900862e6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161127890614449565b602060405180830381600087803b15801561129257600080fd5b505af11580156112a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112ca9190810190613c94565b82828151811015156112d857fe5b90602001906020020181815250508080600101915050611174565b81965050505050505092915050565b606061132e6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff166125a1565b905090565b6000606061133f613953565b6000606060008061138e6040805190810160405280600c81526020017f745f696e5f726563656970740000000000000000000000000000000000000000815250611388336125a1565b8b6102c3565b8b6000018c6020018d6040018e6060018f6080018581525085815250858152508573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152508573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250859950869a50505050505050506000151584151514156114345760008396509650611719565b60008813151561147f5760006040805190810160405280602081526020017f616d6f756e74206d7573742062652067726561746572207468616e207a65726f81525096509650611719565b8785606001511215611519576000608060405190810160405280604481526020017f72657475726e696e6720637265646974206d6f7265207468616e20616d6f756e81526020017f74207472616e736665726564206174206669727374206973206e6f7420616c6c81526020017f6f7765640000000000000000000000000000000000000000000000000000000081525096509650611719565b61156c6040805190810160405280600c81526020017f745f696e5f72656365697074000000000000000000000000000000000000000081525061155f87602001516125a1565b8b8b8960600151036133a8565b809450819550505060001515841515141561158d5760008396509650611719565b6115e06040805190810160405280600d81526020017f745f6f75745f72656365697074000000000000000000000000000000000000008152506115d387600001516125a1565b8b8b8960600151036133a8565b80945081955050506000151584151514156116015760008396509650611719565b61160e8560000151611725565b809450819550829650839750505050506000151584151514156116375760008396509650611719565b878103905061164b85600001518383611fae565b505061165a8560200151611725565b80945081955082965083975050505050878203915061167e85602001518383611fae565b50506000151584151514156116995760008396509650611719565b7fe6200b0dc39bf7d27d0b5c21a854e213d8a63576293a257970a5de773eef0fcb856000015186602001518a6040516116d49392919061411d565b60405180910390a160016040805190810160405280600781526020017f7375636365656400000000000000000000000000000000000000000000000000815250965096505b50505050509250929050565b600060606000806060600080600080606061173f8b6118c0565b809850819950829a50839b508496508597505050505050508181858599509950995099505050505050509193509193565b60006060806000806000806060611786336118c0565b809850819950829a50839b508496508597505050505050506000151582151514156117b757600081975097506118b3565b600285141515611829576000606060405190810160405280602c81526020017f6f6e6c792062616e6b732061726520616c6c6f77656420746f2072656769737481526020017f657220636f6d70616e6965730000000000000000000000000000000000000000815250975097506118b3565b6118388a8a6003600080612d75565b50507f526aa5c4a7b2027c55b69064b0a1fd286088158b686f08699d4497a93b5b2e6660038b8b60405161186e9392919061434b565b60405180910390a160016040805190810160405280600781526020017f7375636365656400000000000000000000000000000000000000000000000000815250975097505b5050505050509250929050565b600060608060008060008060008061190c6040805190810160405280600981526020017f745f636f6d70616e790000000000000000000000000000000000000000000000815250611ef7565b92508273ffffffffffffffffffffffffffffffffffffffff1663d8ac59576119338c6125a1565b8573ffffffffffffffffffffffffffffffffffffffff1663c74f8caf6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561199757600080fd5b505af11580156119ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119cf9190810190613bf0565b6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611a089291906143ab565b602060405180830381600087803b158015611a2257600080fd5b505af1158015611a36573d","6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a5a9190810190613c19565b915060009850606060405190810160405280602781526020017f636f6d70616e7920646f6573206e6f74206578697374206f72206973206e6f7481526020017f20756e6971756500000000000000000000000000000000000000000000000000815250975060018273ffffffffffffffffffffffffffffffffffffffff1663d3e9af5a6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611b2557600080fd5b505af1158015611b39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611b5d9190810190613c94565b1415611eeb57600198506040805190810160405280600781526020017f737563636565640000000000000000000000000000000000000000000000000081525097508173ffffffffffffffffffffffffffffffffffffffff16633dd2b61460006040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611bf591906142f2565b602060405180830381600087803b158015611c0f57600080fd5b505af1158015611c23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c479190810190613c42565b90508073ffffffffffffffffffffffffffffffffffffffff16639bca41e86040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611c9c906146c7565b600060405180830381600087803b158015611cb657600080fd5b505af1158015611cca573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250611cf39190810190613cf9565b96508073ffffffffffffffffffffffffffffffffffffffff16634900862e6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611d48906145d6565b602060405180830381600087803b158015611d6257600080fd5b505af1158015611d76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d9a9190810190613c94565b95508073ffffffffffffffffffffffffffffffffffffffff16634900862e6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611def90614497565b602060405180830381600087803b158015611e0957600080fd5b505af1158015611e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611e419190810190613c94565b94508073ffffffffffffffffffffffffffffffffffffffff16634900862e6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611e96906144e5565b602060405180830381600087803b158015611eb057600080fd5b505af1158015611ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ee89190810190613c94565b93505b50505091939550919395565b60008061100190508073ffffffffffffffffffffffffffffffffffffffff166359a48b65846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611f549190614389565b602060405180830381600087803b158015611f6e57600080fd5b505af1158015611f82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611fa69190810190613c6b565b915050919050565b600060606000806000611ff56040805190810160405280600981526020017f745f636f6d70616e790000000000000000000000000000000000000000000000815250611ef7565b92508273ffffffffffffffffffffffffffffffffffffffff1663d8ac595761201c8a6125a1565b8573ffffffffffffffffffffffffffffffffffffffff1663c74f8caf6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561208057600080fd5b505af1158015612094573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506120b89190810190613bf0565b6040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016120f19291906143ab565b602060405180830381600087803b15801561210b57600080fd5b505af115801561211f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121439190810190613c19565b915060018273ffffffffffffffffffffffffffffffffffffffff1663d3e9af5a6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156121ab57600080fd5b505af11580156121bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121e39190810190613c94565b141515612252576000606060405190810160405280602781526020017f636f6d70616e7920646f6573206e6f74206578697374206f72206973206e6f7481526020017f20756e697175650000000000000000000000000000000000000000000000000081525094509450612596565b8173ffffffffffffffffffffffffffffffffffffffff16633dd2b61460006040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016122a891906142f2565b602060405180830381600087803b1580156122c257600080fd5b505af11580156122d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122fa9190810190613c42565b90508073ffffffffffffffffffffffffffffffffffffffff1663def42698886040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161235191906144b7565b600060405180830381600087803b15801561236b57600080fd5b505af115801561237f573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663def42698876040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016123d89190614505565b600060405180830381600087803b1580156123f257600080fd5b505af1158015612406573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663664b37d661242f8a6125a1565b838673ffffffffffffffffffffffffffffffffffffffff1663c74f8caf6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561249457600080fd5b505af11580156124a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506124cc9190810190613bf0565b6040518463ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016125069392919061440b565b602060405180830381600087803b15801561252057600080fd5b505af1158015612534573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125589190810190613c94565b5060016040805190810160405280600781526020017f7375636365656400000000000000000000000000000000000000000000000000815250945094505b505050935093915050565b6060600060608060008573ffffffffffffffffffffffffffffffffffffffff1660010293506040805190810160405280601081526020017f30313233343536373839616263646566000000000000000000000000000000008152509250602a6040519080825280601f01601f1916602001820160405280156126325781602001602082028038833980820191505090505b5091507f300000000000000000000000000000000000000000000000000000000000000082600081518110151561266557fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008260018151811015156126c557fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600090505b60148110156129455782600485600c840160208110151561271757fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060020a90047f0100000000000000000000000000000000000000000000000000000000000000900481518110151561279157fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000282600283026002018151811015156127f057fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535082600f7f01000000000000000000000000000000000000000000000000000000000000000285600c840160208110151561285657fe5b1a7f010000000000000000000000000000000000000000000000000000000000000002167f010000000000000000000000000000000000000000000000000000000000000090048151811015156128a957fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002826002830260030181518110151561290857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506126fa565b81945050505050919050565b60008061295d85611ef7565b91508173ffffffffffffffffffffffffffffffffffffffff16635887ab246040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156129c357600080fd5b505af11580156129d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129fb9190810190613c42565b90508073ffffffffffffffffffffffffffffffffffffffff16631a391cb4612a2685600001516125a1565b6040518263ffff","ffff167c0100000000000000000000000000000000000000000000000000000000028152600401612a5e9190614692565b600060405180830381600087803b158015612a7857600080fd5b505af1158015612a8c573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16631a391cb4612ab985602001516125a1565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612af191906145a1565b600060405180830381600087803b158015612b0b57600080fd5b505af1158015612b1f573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663def4269884604001516040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612b7c9190614469565b600060405180830381600087803b158015612b9657600080fd5b505af1158015612baa573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663def4269884606001516040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612c079190614553565b600060405180830381600087803b158015612c2157600080fd5b505af1158015612c35573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663def4269884608001516040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612c929190614644565b600060405180830381600087803b158015612cac57600080fd5b505af1158015612cc0573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff16634c6f30c085836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612d1b9291906143db565b602060405180830381600087803b158015612d3557600080fd5b505af1158015612d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d6d9190810190613c94565b505050505050565b600060606000806000612dbc6040805190810160405280600981526020017f745f636f6d70616e790000000000000000000000000000000000000000000000815250611ef7565b92508273ffffffffffffffffffffffffffffffffffffffff1663d8ac5957612de38c6125a1565b8573ffffffffffffffffffffffffffffffffffffffff1663c74f8caf6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015612e4757600080fd5b505af1158015612e5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e7f9190810190613bf0565b6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612eb89291906143ab565b602060405180830381600087803b158015612ed257600080fd5b505af1158015612ee6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612f0a9190810190613c19565b915060008273ffffffffffffffffffffffffffffffffffffffff1663d3e9af5a6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015612f7257600080fd5b505af1158015612f86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612faa9190810190613c94565b141515612ff25760006040805190810160405280601881526020017f636f6d70616e792073686f756c64206e6f7420657869737400000000000000008152509450945061339b565b8273ffffffffffffffffffffffffffffffffffffffff16635887ab246040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561305657600080fd5b505af115801561306a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061308e9190810190613c42565b90508073ffffffffffffffffffffffffffffffffffffffff16631a391cb48a6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016130e591906146e7565b600060405180830381600087803b1580156130ff57600080fd5b505af1158015613113573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663def42698896040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161316c91906145f6565b600060405180830381600087803b15801561318657600080fd5b505af115801561319a573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663def42698886040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016131f391906144b7565b600060405180830381600087803b15801561320d57600080fd5b505af1158015613221573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663def42698876040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161327a9190614505565b600060405180830381600087803b15801561329457600080fd5b505af11580156132a8573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff16634c6f30c06132d18c6125a1565b836040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161330b9291906143db565b602060405180830381600087803b15801561332557600080fd5b505af1158015613339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061335d9190810190613c94565b5060016040805190810160405280600781526020017f7375636365656400000000000000000000000000000000000000000000000000815250945094505b5050509550959350505050565b600060606000806000806133bb8a611ef7565b93508373ffffffffffffffffffffffffffffffffffffffff1663c74f8caf6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561342157600080fd5b505af1158015613435573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506134599190810190613bf0565b92508273ffffffffffffffffffffffffffffffffffffffff1663d62b54b4896040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016134b09190614469565b600060405180830381600087803b1580156134ca57600080fd5b505af11580156134de573d6000803e3d6000fd5b5050505060008713151561359b578373ffffffffffffffffffffffffffffffffffffffff166309ff42f08a856040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016135439291906143ab565b602060405180830381600087803b15801561355d57600080fd5b505af1158015613571573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506135959190810190613c94565b50613946565b8373ffffffffffffffffffffffffffffffffffffffff1663d8ac59578a856040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016135f29291906143ab565b602060405180830381600087803b15801561360c57600080fd5b505af1158015613620573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506136449190810190613c19565b915060018273ffffffffffffffffffffffffffffffffffffffff1663d3e9af5a6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156136ac57600080fd5b505af11580156136c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506136e49190810190613c94565b14151561372c5760006040805190810160405280601f81526020017f72656365697074206964206e6f7420657869737473206f7220756e697175650081525095509550613946565b8173ffffffffffffffffffffffffffffffffffffffff16633dd2b61460006040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161378291906142f2565b602060405180830381600087803b15801561379c57600080fd5b505af11580156137b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506137d49190810190613c42565b90508073ffffffffffffffffffffffffffffffffffffffff1663def42698886040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161382b9190614553565b600060405180830381600087803b15801561384557600080fd5b505af1158015613859573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff1663664b37d68a83866040518463ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016138b69392919061440b565b602060405180830381600087803b1580156138d057600080fd5b505af11580156138e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506139089190810190613c94565b5060016040805190810160405280600781526020017f7375636365656400000000000000000000000000000000000000000000000000815250955095505b5050505094509492505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081525090565b60006139bb82356147db565b905092915050565b60006139cf82516147db565b905092915050565b60006139e382516147fb565b905092915050565b60006139f7825161480d565b905092915050565b6000613a0b825161481f565b905092915050565b6000613a1f8251614831565b905092915050565b6000613a3382","35614843565b905092915050565b6000613a478251614843565b905092915050565b600082601f8301121515613a6257600080fd5b8135613a75613a7082614749565b61471c565b91508082526020830160208301858383011115613a9157600080fd5b613a9c8382846148a7565b50505092915050565b600082601f8301121515613ab857600080fd5b8151613acb613ac682614749565b61471c565b91508082526020830160208301858383011115613ae757600080fd5b613af28382846148b6565b50505092915050565b600060208284031215613b0d57600080fd5b6000613b1b848285016139af565b91505092915050565b600060208284031215613b3657600080fd5b6000613b44848285016139c3565b91505092915050565b600080600060608486031215613b6257600080fd5b6000613b70868287016139af565b9350506020613b8186828701613a27565b9250506040613b9286828701613a27565b9150509250925092565b60008060408385031215613baf57600080fd5b6000613bbd858286016139af565b925050602083013567ffffffffffffffff811115613bda57600080fd5b613be685828601613a4f565b9150509250929050565b600060208284031215613c0257600080fd5b6000613c10848285016139d7565b91505092915050565b600060208284031215613c2b57600080fd5b6000613c39848285016139eb565b91505092915050565b600060208284031215613c5457600080fd5b6000613c62848285016139ff565b91505092915050565b600060208284031215613c7d57600080fd5b6000613c8b84828501613a13565b91505092915050565b600060208284031215613ca657600080fd5b6000613cb484828501613a3b565b91505092915050565b60008060408385031215613cd057600080fd5b6000613cde85828601613a27565b9250506020613cef85828601613a27565b9150509250929050565b600060208284031215613d0b57600080fd5b600082015167ffffffffffffffff811115613d2557600080fd5b613d3184828501613aa5565b91505092915050565b60008060408385031215613d4d57600080fd5b600083013567ffffffffffffffff811115613d6757600080fd5b613d7385828601613a4f565b925050602083013567ffffffffffffffff811115613d9057600080fd5b613d9c85828601613a4f565b9150509250929050565b600080600060608486031215613dbb57600080fd5b600084013567ffffffffffffffff811115613dd557600080fd5b613de186828701613a4f565b935050602084013567ffffffffffffffff811115613dfe57600080fd5b613e0a86828701613a4f565b9250506040613e1b86828701613a27565b9150509250925092565b613e2e816147a5565b82525050565b6000613e3f82614782565b808452602084019350613e5183614775565b60005b82811015613e8357613e67868351613ebc565b613e7082614798565b9150602086019550600181019050613e54565b50849250505092915050565b613e98816147c5565b82525050565b613ea78161484d565b82525050565b613eb68161485f565b82525050565b613ec5816147d1565b82525050565b613ed481614871565b82525050565b613ee381614883565b82525050565b613ef281614895565b82525050565b6000613f038261478d565b808452613f178160208601602086016148b6565b613f20816148e9565b602085010191505092915050565b6000600982527f72656365697074496400000000000000000000000000000000000000000000006020830152604082019050919050565b6000600b82527f696e5f72656365697074730000000000000000000000000000000000000000006020830152604082019050919050565b6000600c82527f6f75745f726563656970747300000000000000000000000000000000000000006020830152604082019050919050565b6000600682527f616d6f756e7400000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600682527f64656274656500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600482527f74797065000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600882527f646561646c696e650000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600682527f646562746f7200000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600482527f75736363000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006060820190506141326000830186613e25565b61413f6020830185613e25565b61414c6040830184613ebc565b949350505050565b6000602082019050818103600083015261416e8184613e34565b905092915050565b600060408201905061418b6000830185613e8f565b818103602083015261419d8184613ef8565b90509392505050565b600060e0820190506141bb600083018a613e8f565b81810360208301526141cd8189613ef8565b90506141dc6040830188613e25565b6141e96060830187613e25565b6141f66080830186613ebc565b61420360a0830185613ebc565b61421060c0830184613ebc565b98975050505050505050565b60006080820190506142316000830187613e8f565b81810360208301526142438186613ef8565b90506142526040830185613ebc565b61425f6060830184613ebc565b95945050505050565b600060c08201905061427d6000830189613e8f565b818103602083015261428f8188613ef8565b905081810360408301526142a38187613ef8565b90506142b26060830186613ebc565b6142bf6080830185613ebc565b6142cc60a0830184613ebc565b979650505050505050565b60006020820190506142ec6000830184613ebc565b92915050565b60006020820190506143076000830184613ecb565b92915050565b60006060820190506143226000830186613eda565b61432f6020830185613e25565b81810360408301526143418184613ef8565b9050949350505050565b60006060820190506143606000830186613ee9565b61436d6020830185613e25565b818103604083015261437f8184613ef8565b9050949350505050565b600060208201905081810360008301526143a38184613ef8565b905092915050565b600060408201905081810360008301526143c58185613ef8565b90506143d46020830184613e9e565b9392505050565b600060408201905081810360008301526143f58185613ef8565b90506144046020830184613ead565b9392505050565b600060608201905081810360008301526144258186613ef8565b90506144346020830185613ead565b6144416040830184613e9e565b949350505050565b6000602082019050818103600083015261446281613f2e565b9050919050565b6000604082019050818103600083015261448281613f2e565b90506144916020830184613ebc565b92915050565b600060208201905081810360008301526144b081613f65565b9050919050565b600060408201905081810360008301526144d081613f65565b90506144df6020830184613ebc565b92915050565b600060208201905081810360008301526144fe81613f9c565b9050919050565b6000604082019050818103600083015261451e81613f9c565b905061452d6020830184613ebc565b92915050565b6000602082019050818103600083015261454c81613fd3565b9050919050565b6000604082019050818103600083015261456c81613fd3565b905061457b6020830184613ebc565b92915050565b6000602082019050818103600083015261459a8161400a565b9050919050565b600060408201905081810360008301526145ba8161400a565b905081810360208301526145ce8184613ef8565b905092915050565b600060208201905081810360008301526145ef81614041565b9050919050565b6000604082019050818103600083015261460f81614041565b905061461e6020830184613ebc565b92915050565b6000602082019050818103600083015261463d81614078565b9050919050565b6000604082019050818103600083015261465d81614078565b905061466c6020830184613ebc565b92915050565b6000602082019050818103600083015261468b816140af565b9050919050565b600060408201905081810360008301526146ab816140af565b905081810360208301526146bf8184613ef8565b905092915050565b600060208201905081810360008301526146e0816140e6565b9050919050565b60006040820190508181036000830152614700816140e6565b905081810360208301526147148184613ef8565b905092915050565b6000604051905081810181811067ffffffffffffffff8211171561473f57600080fd5b8060405250919050565b600067ffffffffffffffff82111561476057600080fd5b601f19601f8301169050602081019050919050565b6000602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614806826147a5565b9050919050565b6000614818826147a5565b9050919050565b600061482a826147a5565b9050919050565b600061483c826147a5565b9050919050565b6000819050919050565b6000614858826147a5565b9050919050565b600061486a826147a5565b9050919050565b600061487c826147d1565b9050919050565b600061488e826147d1565b9050919050565b60006148a0826147d1565b9050919050565b82818337600083830152505050565b60005b838110156148d45780820151818401526020810190506148b9565b838111156148e3576000848401525b50505050565b6000601f19601f83011690509190505600a265627a7a723058202216068e63f7797da51169a508bf86d1d2abddff5bbe07b5e4c0a8940ba42cd66c6578706572696d656e74616cf50037"};

    public static final String SM_BINARY = String.join("", SM_BINARY_ARRAY);

    public static final String[] ABI_ARRAY = {"[{\"constant\":false,\"inputs\":[{\"name\":\"tableName\",\"type\":\"string\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"receiptId\",\"type\":\"int256\"}],\"name\":\"selectReceipt\",\"outputs\":[{\"name\":\"flag\",\"type\":\"bool\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"debtor\",\"type\":\"address\"},{\"name\":\"debtee\",\"type\":\"address\"},{\"name\":\"receiptId1\",\"type\":\"int256\"},{\"name\":\"amount\",\"type\":\"int256\"},{\"name\":\"deadline\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"addr\",\"type\":\"address\"},{\"name\":\"uscc\",\"type\":\"string\"}],\"name\":\"registerCompany\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"},{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"receiptId\",\"type\":\"int256\"},{\"name\":\"amount\",\"type\":\"int256\"}],\"name\":\"returnReceipt\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"},{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"getAdmin\",\"outputs\":[{\"name\":\"s\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"addr\",\"type\":\"address\"},{\"name\":\"uscc\",\"type\":\"string\"}],\"name\":\"registerBank\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"},{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"selectCompanyReceipts\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"},{\"name\":\"\",\"type\":\"string\"},{\"name\":\"\",\"type\":\"int256\"},{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"debtee\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"int256\"},{\"name\":\"deadline\",\"type\":\"int256\"}],\"name\":\"transferReceipt\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"},{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"selectCompany\",\"outputs\":[{\"name\":\"flag\",\"type\":\"bool\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"r1\",\"type\":\"string\"},{\"name\":\"r2\",\"type\":\"int256\"},{\"name\":\"r3\",\"type\":\"int256\"},{\"name\":\"r4\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"tableName\",\"type\":\"string\"},{\"name\":\"key\",\"type\":\"string\"}],\"name\":\"getReceiptAllId\",\"outputs\":[{\"name\":\"allid\",\"type\":\"int256[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"company_type\",\"type\":\"int256\"},{\"indexed\":false,\"name\":\"addr\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"uscc\",\"type\":\"string\"}],\"name\":\"RegistrationEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amount\",\"type\":\"int256\"}],\"name\":\"TransactionEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amount\",\"type\":\"int256\"}],\"name\":\"ReturnEvent\",\"type\":\"event\"}]"};

    public static final String ABI = String.join("", ABI_ARRAY);

    public static final String FUNC_SELECTRECEIPT = "selectReceipt";

    public static final String FUNC_REGISTERCOMPANY = "registerCompany";

    public static final String FUNC_RETURNRECEIPT = "returnReceipt";

    public static final String FUNC_GETADMIN = "getAdmin";

    public static final String FUNC_REGISTERBANK = "registerBank";

    public static final String FUNC_SELECTCOMPANYRECEIPTS = "selectCompanyReceipts";

    public static final String FUNC_TRANSFERRECEIPT = "transferReceipt";

    public static final String FUNC_SELECTCOMPANY = "selectCompany";

    public static final String FUNC_GETRECEIPTALLID = "getReceiptAllId";

    public static final Event REGISTRATIONEVENT_EVENT = new Event("RegistrationEvent", 
            Arrays.<TypeReference<?>>asList(new TypeReference<Int256>() {}, new TypeReference<Address>() {}, new TypeReference<Utf8String>() {}));
    ;

    public static final Event TRANSACTIONEVENT_EVENT = new Event("TransactionEvent", 
            Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}, new TypeReference<Address>() {}, new TypeReference<Int256>() {}));
    ;

    public static final Event RETURNEVENT_EVENT = new Event("ReturnEvent", 
            Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}, new TypeReference<Address>() {}, new TypeReference<Int256>() {}));
    ;

    protected SupplierFinancin(String contractAddress, Client client, CryptoKeyPair credential) {
        super(getBinary(client.getCryptoSuite()), contractAddress, client, credential);
    }

    public static String getBinary(CryptoSuite cryptoSuite) {
        return (cryptoSuite.getCryptoTypeConfig() == CryptoType.ECDSA_TYPE ? BINARY : SM_BINARY);
    }

    public TransactionReceipt selectReceipt(String tableName, String key, BigInteger receiptId) {
        final Function function = new Function(
                FUNC_SELECTRECEIPT, 
                Arrays.<Type>asList(new Utf8String(tableName),
                new Utf8String(key),
                new Int256(receiptId)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void selectReceipt(String tableName, String key, BigInteger receiptId, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_SELECTRECEIPT, 
                Arrays.<Type>asList(new Utf8String(tableName),
                new Utf8String(key),
                new Int256(receiptId)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForSelectReceipt(String tableName, String key, BigInteger receiptId) {
        final Function function = new Function(
                FUNC_SELECTRECEIPT, 
                Arrays.<Type>asList(new Utf8String(tableName),
                new Utf8String(key),
                new Int256(receiptId)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple3<String, String, BigInteger> getSelectReceiptInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_SELECTRECEIPT, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Utf8String>() {}, new TypeReference<Utf8String>() {}, new TypeReference<Int256>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple3<String, String, BigInteger>(

                (String) results.get(0).getValue(), 
                (String) results.get(1).getValue(), 
                (BigInteger) results.get(2).getValue()
                );
    }

    public Tuple7<Boolean, String, String, String, BigInteger, BigInteger, BigInteger> getSelectReceiptOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_SELECTRECEIPT, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}, new TypeReference<Utf8String>() {}, new TypeReference<Address>() {}, new TypeReference<Address>() {}, new TypeReference<Int256>() {}, new TypeReference<Int256>() {}, new TypeReference<Int256>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple7<Boolean, String, String, String, BigInteger, BigInteger, BigInteger>(

                (Boolean) results.get(0).getValue(), 
                (String) results.get(1).getValue(), 
                (String) results.get(2).getValue(), 
                (String) results.get(3).getValue(), 
                (BigInteger) results.get(4).getValue(), 
                (BigInteger) results.get(5).getValue(), 
                (BigInteger) results.get(6).getValue()
                );
    }

    public TransactionReceipt registerCompany(String addr, String uscc) {
        final Function function = new Function(
                FUNC_REGISTERCOMPANY, 
                Arrays.<Type>asList(new Address(addr),
                new Utf8String(uscc)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void registerCompany(String addr, String uscc, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_REGISTERCOMPANY, 
                Arrays.<Type>asList(new Address(addr),
                new Utf8String(uscc)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForRegisterCompany(String addr, String uscc) {
        final Function function = new Function(
                FUNC_REGISTERCOMPANY, 
                Arrays.<Type>asList(new Address(addr),
                new Utf8String(uscc)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple2<String, String> getRegisterCompanyInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_REGISTERCOMPANY, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}, new TypeReference<Utf8String>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<String, String>(

                (String) results.get(0).getValue(), 
                (String) results.get(1).getValue()
                );
    }

    public Tuple2<Boolean, String> getRegisterCompanyOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_REGISTERCOMPANY, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}, new TypeReference<Utf8String>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<Boolean, String>(

                (Boolean) results.get(0).getValue(), 
                (String) results.get(1).getValue()
                );
    }

    public TransactionReceipt returnReceipt(BigInteger receiptId, BigInteger amount) {
        final Function function = new Function(
                FUNC_RETURNRECEIPT, 
                Arrays.<Type>asList(new Int256(receiptId),
                new Int256(amount)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void returnReceipt(BigInteger receiptId, BigInteger amount, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_RETURNRECEIPT, 
                Arrays.<Type>asList(new Int256(receiptId),
                new Int256(amount)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForReturnReceipt(BigInteger receiptId, BigInteger amount) {
        final Function function = new Function(
                FUNC_RETURNRECEIPT, 
                Arrays.<Type>asList(new Int256(receiptId),
                new Int256(amount)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple2<BigInteger, BigInteger> getReturnReceiptInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_RETURNRECEIPT, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Int256>() {}, new TypeReference<Int256>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<BigInteger, BigInteger>(

                (BigInteger) results.get(0).getValue(), 
                (BigInteger) results.get(1).getValue()
                );
    }

    public Tuple2<Boolean, String> getReturnReceiptOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_RETURNRECEIPT, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}, new TypeReference<Utf8String>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<Boolean, String>(

                (Boolean) results.get(0).getValue(), 
                (String) results.get(1).getValue()
                );
    }

    public TransactionReceipt getAdmin() {
        final Function function = new Function(
                FUNC_GETADMIN, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void getAdmin(TransactionCallback callback) {
        final Function function = new Function(
                FUNC_GETADMIN, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForGetAdmin() {
        final Function function = new Function(
                FUNC_GETADMIN, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getGetAdminOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_GETADMIN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Utf8String>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>(

                (String) results.get(0).getValue()
                );
    }

    public TransactionReceipt registerBank(String addr, String uscc) {
        final Function function = new Function(
                FUNC_REGISTERBANK, 
                Arrays.<Type>asList(new Address(addr),
                new Utf8String(uscc)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void registerBank(String addr, String uscc, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_REGISTERBANK, 
                Arrays.<Type>asList(new Address(addr),
                new Utf8String(uscc)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForRegisterBank(String addr, String uscc) {
        final Function function = new Function(
                FUNC_REGISTERBANK, 
                Arrays.<Type>asList(new Address(addr),
                new Utf8String(uscc)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple2<String, String> getRegisterBankInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_REGISTERBANK, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}, new TypeReference<Utf8String>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<String, String>(

                (String) results.get(0).getValue(), 
                (String) results.get(1).getValue()
                );
    }

    public Tuple2<Boolean, String> getRegisterBankOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_REGISTERBANK, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}, new TypeReference<Utf8String>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<Boolean, String>(

                (Boolean) results.get(0).getValue(), 
                (String) results.get(1).getValue()
                );
    }

    public TransactionReceipt selectCompanyReceipts(String addr) {
        final Function function = new Function(
                FUNC_SELECTCOMPANYRECEIPTS, 
                Arrays.<Type>asList(new Address(addr)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void selectCompanyReceipts(String addr, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_SELECTCOMPANYRECEIPTS, 
                Arrays.<Type>asList(new Address(addr)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForSelectCompanyReceipts(String addr) {
        final Function function = new Function(
                FUNC_SELECTCOMPANYRECEIPTS, 
                Arrays.<Type>asList(new Address(addr)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getSelectCompanyReceiptsInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_SELECTCOMPANYRECEIPTS, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>(

                (String) results.get(0).getValue()
                );
    }

    public Tuple4<Boolean, String, BigInteger, BigInteger> getSelectCompanyReceiptsOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_SELECTCOMPANYRECEIPTS, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}, new TypeReference<Utf8String>() {}, new TypeReference<Int256>() {}, new TypeReference<Int256>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple4<Boolean, String, BigInteger, BigInteger>(

                (Boolean) results.get(0).getValue(), 
                (String) results.get(1).getValue(), 
                (BigInteger) results.get(2).getValue(), 
                (BigInteger) results.get(3).getValue()
                );
    }

    public TransactionReceipt transferReceipt(String debtee, BigInteger amount, BigInteger deadline) {
        final Function function = new Function(
                FUNC_TRANSFERRECEIPT, 
                Arrays.<Type>asList(new Address(debtee),
                new Int256(amount),
                new Int256(deadline)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void transferReceipt(String debtee, BigInteger amount, BigInteger deadline, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_TRANSFERRECEIPT, 
                Arrays.<Type>asList(new Address(debtee),
                new Int256(amount),
                new Int256(deadline)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForTransferReceipt(String debtee, BigInteger amount, BigInteger deadline) {
        final Function function = new Function(
                FUNC_TRANSFERRECEIPT, 
                Arrays.<Type>asList(new Address(debtee),
                new Int256(amount),
                new Int256(deadline)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple3<String, BigInteger, BigInteger> getTransferReceiptInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_TRANSFERRECEIPT, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}, new TypeReference<Int256>() {}, new TypeReference<Int256>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple3<String, BigInteger, BigInteger>(

                (String) results.get(0).getValue(), 
                (BigInteger) results.get(1).getValue(), 
                (BigInteger) results.get(2).getValue()
                );
    }

    public Tuple2<Boolean, String> getTransferReceiptOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_TRANSFERRECEIPT, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}, new TypeReference<Utf8String>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<Boolean, String>(

                (Boolean) results.get(0).getValue(), 
                (String) results.get(1).getValue()
                );
    }

    public TransactionReceipt selectCompany(String addr) {
        final Function function = new Function(
                FUNC_SELECTCOMPANY, 
                Arrays.<Type>asList(new Address(addr)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void selectCompany(String addr, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_SELECTCOMPANY, 
                Arrays.<Type>asList(new Address(addr)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForSelectCompany(String addr) {
        final Function function = new Function(
                FUNC_SELECTCOMPANY, 
                Arrays.<Type>asList(new Address(addr)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getSelectCompanyInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_SELECTCOMPANY, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>(

                (String) results.get(0).getValue()
                );
    }

    public Tuple6<Boolean, String, String, BigInteger, BigInteger, BigInteger> getSelectCompanyOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_SELECTCOMPANY, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}, new TypeReference<Utf8String>() {}, new TypeReference<Utf8String>() {}, new TypeReference<Int256>() {}, new TypeReference<Int256>() {}, new TypeReference<Int256>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple6<Boolean, String, String, BigInteger, BigInteger, BigInteger>(

                (Boolean) results.get(0).getValue(), 
                (String) results.get(1).getValue(), 
                (String) results.get(2).getValue(), 
                (BigInteger) results.get(3).getValue(), 
                (BigInteger) results.get(4).getValue(), 
                (BigInteger) results.get(5).getValue()
                );
    }

    public TransactionReceipt getReceiptAllId(String tableName, String key) {
        final Function function = new Function(
                FUNC_GETRECEIPTALLID, 
                Arrays.<Type>asList(new Utf8String(tableName),
                new Utf8String(key)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void getReceiptAllId(String tableName, String key, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_GETRECEIPTALLID, 
                Arrays.<Type>asList(new Utf8String(tableName),
                new Utf8String(key)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForGetReceiptAllId(String tableName, String key) {
        final Function function = new Function(
                FUNC_GETRECEIPTALLID, 
                Arrays.<Type>asList(new Utf8String(tableName),
                new Utf8String(key)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple2<String, String> getGetReceiptAllIdInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_GETRECEIPTALLID, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Utf8String>() {}, new TypeReference<Utf8String>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<String, String>(

                (String) results.get(0).getValue(), 
                (String) results.get(1).getValue()
                );
    }

    public Tuple1<List<BigInteger>> getGetReceiptAllIdOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_GETRECEIPTALLID, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicArray<Int256>>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<List<BigInteger>>(

                convertToNative((List<Int256>) results.get(0).getValue())
                );
    }

    public List<RegistrationEventEventResponse> getRegistrationEventEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = extractEventParametersWithLog(REGISTRATIONEVENT_EVENT, transactionReceipt);
        ArrayList<RegistrationEventEventResponse> responses = new ArrayList<RegistrationEventEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            RegistrationEventEventResponse typedResponse = new RegistrationEventEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.company_type = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
            typedResponse.addr = (String) eventValues.getNonIndexedValues().get(1).getValue();
            typedResponse.uscc = (String) eventValues.getNonIndexedValues().get(2).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeRegistrationEventEvent(String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(REGISTRATIONEVENT_EVENT);
        subscribeEvent(ABI,BINARY,topic0,fromBlock,toBlock,otherTopics,callback);
    }

    public void subscribeRegistrationEventEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(REGISTRATIONEVENT_EVENT);
        subscribeEvent(ABI,BINARY,topic0,callback);
    }

    public List<TransactionEventEventResponse> getTransactionEventEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = extractEventParametersWithLog(TRANSACTIONEVENT_EVENT, transactionReceipt);
        ArrayList<TransactionEventEventResponse> responses = new ArrayList<TransactionEventEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            TransactionEventEventResponse typedResponse = new TransactionEventEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.from = (String) eventValues.getNonIndexedValues().get(0).getValue();
            typedResponse.to = (String) eventValues.getNonIndexedValues().get(1).getValue();
            typedResponse.amount = (BigInteger) eventValues.getNonIndexedValues().get(2).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeTransactionEventEvent(String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(TRANSACTIONEVENT_EVENT);
        subscribeEvent(ABI,BINARY,topic0,fromBlock,toBlock,otherTopics,callback);
    }

    public void subscribeTransactionEventEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(TRANSACTIONEVENT_EVENT);
        subscribeEvent(ABI,BINARY,topic0,callback);
    }

    public List<ReturnEventEventResponse> getReturnEventEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = extractEventParametersWithLog(RETURNEVENT_EVENT, transactionReceipt);
        ArrayList<ReturnEventEventResponse> responses = new ArrayList<ReturnEventEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            ReturnEventEventResponse typedResponse = new ReturnEventEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.from = (String) eventValues.getNonIndexedValues().get(0).getValue();
            typedResponse.to = (String) eventValues.getNonIndexedValues().get(1).getValue();
            typedResponse.amount = (BigInteger) eventValues.getNonIndexedValues().get(2).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeReturnEventEvent(String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(RETURNEVENT_EVENT);
        subscribeEvent(ABI,BINARY,topic0,fromBlock,toBlock,otherTopics,callback);
    }

    public void subscribeReturnEventEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(RETURNEVENT_EVENT);
        subscribeEvent(ABI,BINARY,topic0,callback);
    }

    public static SupplierFinancin load(String contractAddress, Client client, CryptoKeyPair credential) {
        return new SupplierFinancin(contractAddress, client, credential);
    }

    public static SupplierFinancin deploy(Client client, CryptoKeyPair credential) throws ContractException {
        return deploy(SupplierFinancin.class, client, credential, getBinary(client.getCryptoSuite()), "");
    }

    public static class RegistrationEventEventResponse {
        public TransactionReceipt.Logs log;

        public BigInteger company_type;

        public String addr;

        public String uscc;
    }

    public static class TransactionEventEventResponse {
        public TransactionReceipt.Logs log;

        public String from;

        public String to;

        public BigInteger amount;
    }

    public static class ReturnEventEventResponse {
        public TransactionReceipt.Logs log;

        public String from;

        public String to;

        public BigInteger amount;
    }
}
